Fix #111031, reported by Padraig O'Briain:
authorMatthias Clasen <mclasen@redhat.com>
Wed, 8 Dec 2004 21:25:08 +0000 (21:25 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 8 Dec 2004 21:25:08 +0000 (21:25 +0000)
2004-12-08  Matthias Clasen  <mclasen@redhat.com>

Fix #111031, reported by Padraig O'Briain:

* gtk/gtktextlayout.h:
* gtk/gtktextlayout.c (gtk_text_layout_get_iter_at_position):
Add a variant of gtk_text_layout_get_iter_at_pixel() which
returns the character at the position, not the closest
cursor position.

* gtk/gtktextview.h:
* gtk/gtktextview.c (gtk_text_view_get_iter_at_position):
Add a variant of gtk_text_view_get_iter_at_location() which
returns the character at the position, not the closest
cursor position.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gtk/gtktextlayout.c
gtk/gtktextlayout.h
gtk/gtktextview.c
gtk/gtktextview.h

index 2f3a5c5d5380bab64bf1675aef520ba7b39971f6..9ec2954ba96941b061db067c46286457d7c34251 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix #111031, reported by Padraig O'Briain:
+       
+       * gtk/gtktextlayout.h: 
+       * gtk/gtktextlayout.c (gtk_text_layout_get_iter_at_position): 
+       Add a variant of gtk_text_layout_get_iter_at_pixel() which
+       returns the character at the position, not the closest
+       cursor position.
+
+       * gtk/gtktextview.h: 
+       * gtk/gtktextview.c (gtk_text_view_get_iter_at_position): 
+       Add a variant of gtk_text_view_get_iter_at_location() which
+       returns the character at the position, not the closest
+       cursor position.
+
 2004-12-08  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkaccelmap.c (internal_change_entry): Remove all 
index 2f3a5c5d5380bab64bf1675aef520ba7b39971f6..9ec2954ba96941b061db067c46286457d7c34251 100644 (file)
@@ -1,3 +1,19 @@
+2004-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix #111031, reported by Padraig O'Briain:
+       
+       * gtk/gtktextlayout.h: 
+       * gtk/gtktextlayout.c (gtk_text_layout_get_iter_at_position): 
+       Add a variant of gtk_text_layout_get_iter_at_pixel() which
+       returns the character at the position, not the closest
+       cursor position.
+
+       * gtk/gtktextview.h: 
+       * gtk/gtktextview.c (gtk_text_view_get_iter_at_position): 
+       Add a variant of gtk_text_view_get_iter_at_location() which
+       returns the character at the position, not the closest
+       cursor position.
+
 2004-12-08  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkaccelmap.c (internal_change_entry): Remove all 
index 2f3a5c5d5380bab64bf1675aef520ba7b39971f6..9ec2954ba96941b061db067c46286457d7c34251 100644 (file)
@@ -1,3 +1,19 @@
+2004-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix #111031, reported by Padraig O'Briain:
+       
+       * gtk/gtktextlayout.h: 
+       * gtk/gtktextlayout.c (gtk_text_layout_get_iter_at_position): 
+       Add a variant of gtk_text_layout_get_iter_at_pixel() which
+       returns the character at the position, not the closest
+       cursor position.
+
+       * gtk/gtktextview.h: 
+       * gtk/gtktextview.c (gtk_text_view_get_iter_at_position): 
+       Add a variant of gtk_text_view_get_iter_at_location() which
+       returns the character at the position, not the closest
+       cursor position.
+
 2004-12-08  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkaccelmap.c (internal_change_entry): Remove all 
index 2f3a5c5d5380bab64bf1675aef520ba7b39971f6..9ec2954ba96941b061db067c46286457d7c34251 100644 (file)
@@ -1,3 +1,19 @@
+2004-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix #111031, reported by Padraig O'Briain:
+       
+       * gtk/gtktextlayout.h: 
+       * gtk/gtktextlayout.c (gtk_text_layout_get_iter_at_position): 
+       Add a variant of gtk_text_layout_get_iter_at_pixel() which
+       returns the character at the position, not the closest
+       cursor position.
+
+       * gtk/gtktextview.h: 
+       * gtk/gtktextview.c (gtk_text_view_get_iter_at_position): 
+       Add a variant of gtk_text_view_get_iter_at_location() which
+       returns the character at the position, not the closest
+       cursor position.
+
 2004-12-08  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkaccelmap.c (internal_change_entry): Remove all 
index a4ca172bfed83282967c6a46e1eaa95fe2bb33ce..10b2d10df34ce5fc991027b3b62514673de5f7f9 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtk-sections.txt: Add gtk_text_view_get_iter_at_position.
+
 2004-12-07  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/images/colorsel.png:
index b1e9496d44645de7c86362ce9a3e54e412141f75..d0efc4cd5d1806844c9ef81027f565ae3f7e90cb 100644 (file)
@@ -3216,6 +3216,7 @@ gtk_text_view_get_iter_location
 gtk_text_view_get_line_at_y
 gtk_text_view_get_line_yrange
 gtk_text_view_get_iter_at_location
+gtk_text_view_get_iter_at_position
 gtk_text_view_buffer_to_window_coords
 gtk_text_view_window_to_buffer_coords
 gtk_text_view_get_window
index 56d100d0a04ad106539440bc0e18a9866d01bb35..3738a93e57a7594d07359ce379ac95762f732935 100644 (file)
@@ -2277,11 +2277,25 @@ gtk_text_layout_get_line_at_y (GtkTextLayout *layout,
 
 void
 gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout,
-                                   GtkTextIter *target_iter,
-                                   gint x, gint y)
+                                   GtkTextIter   *target_iter,
+                                   gint           x, 
+                                  gint           y)
+{
+  gint trailing;
+
+  gtk_text_layout_get_iter_at_position (layout, target_iter, &trailing, x, y);
+
+  gtk_text_iter_forward_chars (target_iter, trailing);  
+}
+
+void gtk_text_layout_get_iter_at_position (GtkTextLayout     *layout,
+                                          GtkTextIter       *target_iter,
+                                          gint              *trailing,
+                                          gint               x,
+                                          gint               y)
 {
   GtkTextLine *line;
-  gint byte_index, trailing;
+  gint byte_index;
   gint line_top;
   GtkTextLineDisplay *display;
 
@@ -2301,7 +2315,7 @@ gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout,
   if (y > display->height - display->top_margin - display->bottom_margin)
     {
       byte_index = _gtk_text_line_byte_count (line);
-      trailing = 0;
+      *trailing = 0;
     }
   else
     {
@@ -2310,14 +2324,15 @@ gtk_text_layout_get_iter_at_pixel (GtkTextLayout *layout,
         * x-direction.
         */
       pango_layout_xy_to_index (display->layout, x * PANGO_SCALE, y * PANGO_SCALE,
-                                &byte_index, &trailing);
+                                &byte_index, trailing);
     }
 
-  line_display_index_to_iter (layout, display, target_iter, byte_index, trailing);
+  line_display_index_to_iter (layout, display, target_iter, byte_index, 0);
 
   gtk_text_layout_free_line_display (layout, display);
 }
 
+
 /**
  * gtk_text_layout_get_cursor_locations:
  * @layout: a #GtkTextLayout
index f42a7c3c0a6ab68729ca7c241c71849a8de030bd..0e02b1294a7f03cc46e68f04707a2304c742d78e 100644 (file)
@@ -319,6 +319,11 @@ void gtk_text_layout_get_iter_at_pixel (GtkTextLayout     *layout,
                                         GtkTextIter       *iter,
                                         gint               x,
                                         gint               y);
+void gtk_text_layout_get_iter_at_position (GtkTextLayout     *layout,
+                                          GtkTextIter       *iter,
+                                          gint              *trailing,
+                                          gint               x,
+                                          gint               y);
 void gtk_text_layout_invalidate        (GtkTextLayout     *layout,
                                         const GtkTextIter *start,
                                         const GtkTextIter *end);
index 17fc6981588e14e09eefce9de8c8bea12babbdcd..12820f91e019e944c8eabae9ae9e55ef7092a88f 100644 (file)
@@ -1297,9 +1297,44 @@ gtk_text_view_get_iter_at_location (GtkTextView *text_view,
   gtk_text_view_ensure_layout (text_view);
   
   gtk_text_layout_get_iter_at_pixel (text_view->layout,
-                                     iter,
-                                     x,
-                                     y);
+                                     iter, x, y);
+}
+
+/**
+ * gtk_text_view_get_iter_at_position:
+ * @text_view: a #GtkTextView
+ * @iter: a #GtkTextIter
+ * @trailing: 
+ * @x: x position, in buffer coordinates
+ * @y: y position, in buffer coordinates
+ *
+ * Retrieves the iterator pointing to the character at buffer 
+ * coordinates @x and @y. Buffer coordinates are coordinates for 
+ * the entire buffer, not just the currently-displayed portion.  
+ * If you have coordinates from an event, you have to convert 
+ * those to buffer coordinates with 
+ * gtk_text_view_window_to_buffer_coords().
+ *
+ * Note that this is diffferent from gtk_text_view_get_iter_at_location(),
+ * which returns cursor locations, i.e. positions <emphasis>between</emphasis>
+ * characters.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_text_view_get_iter_at_position (GtkTextView *text_view,
+                                   GtkTextIter *iter,
+                                   gint        *trailing,
+                                   gint         x,
+                                   gint         y)
+{
+  g_return_if_fail (GTK_IS_TEXT_VIEW (text_view));
+  g_return_if_fail (iter != NULL);
+
+  gtk_text_view_ensure_layout (text_view);
+  
+  gtk_text_layout_get_iter_at_position (text_view->layout,
+                                       iter, trailing, x, y);
 }
 
 /**
index dca3881a2849bfa69f81248420b80a671f0b34e5..3ad5cd6feb2705adeb5ad11cd67b6f3e8e9d13ac 100644 (file)
@@ -250,6 +250,11 @@ void           gtk_text_view_get_iter_at_location  (GtkTextView   *text_view,
                                                     GtkTextIter   *iter,
                                                     gint           x,
                                                     gint           y);
+void           gtk_text_view_get_iter_at_position  (GtkTextView   *text_view,
+                                                    GtkTextIter   *iter,
+                                                   gint          *trailing,
+                                                    gint           x,
+                                                    gint           y);
 void           gtk_text_view_get_line_yrange       (GtkTextView       *text_view,
                                                     const GtkTextIter *iter,
                                                     gint              *y,